package reflect;

// 反射测试

// 私有属性的访问通过反射可以做到，但是正常new对象引用是做不到的
// 给一个学生类
class Student{
    //私有属性name
    private String name = "Xianmeng";
    //公有属性age
    public int age = 20;
    //不带参数的构造方法
    public Student(){
        System.out.println("Student()");
    }
    // 私有带参构造方法
    private Student(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student(String,name)");
    }
    private void eat(){
        System.out.println("I am eating");
    }
    public void sleep(){
        System.out.println("I am a pig");
    }
    private void function(String str) {
        System.out.println(str);
    }
    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        // 反射第一步：获取Class对象

        // 方法一：注意要进行异常捕获（参数是包名.类名）  注意返回值类型
        Class<?> c1 = Class.forName("reflect.Student");
        // 方法二：类new对象 +getClass
        Student student = new Student();
        Class<?> c2 = student.getClass();
        // 方法三：直接类.class
        Class<?> c3 = Student.class;

        System.out.println(c1==c2);
        System.out.println(c1==c3);
        System.out.println(c3==c2);
        // 返回值都是true，说明Class对象只有一个
    }

}
